"use strict";
// typeScript中的泛型
/*
泛型，软件工程中，我们不仅要创建一致的定义良好的API，同时也要考虑可重用性。组件不仅能够支持当前的数据类型，
同时也能支持未来的数据类型，这在创建大型系统时为你提供了十分灵活的功能

在像c#和java这样的语言中，可以使用泛型来创建可重用的组件，一个组件可以支持多种类型的数据，
这样用户就可以以自己的数据类型来使用组件

通俗理解，泛型就是解决、类、接口、方法的复用性，以及对不特定数据类型的支持
*/
//只能返回string类型的数据
// function getData(value:string):string{
//     return value
// }
// 同时返回 string类型  和 number类型（代码冗余）
// function getData1(value:string):string{
//     return value
// }
// function getData2(value:number):number{
//     return value
// }
// 同时返回 string类型 和 number类型    any可以解决这个问题
// function getData(value:any):any{
//     return value
// }
// any放弃了类型检查  传入什么，返回什么。比如：传入number类型必须返回number类型 传入 string类型必须返回string类型
// 传入的参数类型和返回的参数类型可以不一致
// function getData(value:any):any{
//     return value
// }
// 泛型：可以支持不特定的数据类型  要求 传入的参数和返回的参数一致
// T表示泛型，具体什么类型是调用这个方法的时候决定的
// function getData<T>(value:T):T{
//     return value
// }
// getData<number>(123);
// getData<number>('123');/*错误的写法*/
// function getData<T>(value:T):any{
//     return 'adwfesgr'
// }
// getData<number>(123);//参数必须是number
// getData<string>('这个一个泛型');//
// 泛型类，比如有个最小堆算法，需要同时支持返回数字和字符串两种类型。通过类的泛型来实现
/*
class MinClass{
    public list:number[]=[];
    add(num:number){
        this.list.push(num)
    }
    min():number{
        var minNum = this.list[0];

        for(var i=0;i<this.list.length;i++){
            if(minNum>this.list[i]){
                minNum = this.list[i];
            }
        }
        return minNum
    }
}

var m = new MinClass();
m.add(30)
m.add(21)
m.add(22)
m.add(23)
m.add(24)
alert(m.min())
*/
// 类的泛型
// class MinClass<T>{
//     public list:T[]=[];
//     add(value:T):void{
//         this.list.push(value)
//     }
//     min():T{
//         var minNum = this.list[0];
//         for(var i=0;i<this.list.length;i++){
//             if(minNum>this.list[i]){
//                 minNum = this.list[i];
//             }
//         }
//         return minNum
//     }
// }
// var m1 = new MinClass<number>();  /*实例化类  并且制定了类的T代表的类型是number*/
// m1.add(11);
// m1.add(13);
// m1.add(12);
// alert(m1.min())
// var m2 = new MinClass<string>();  /*实例化类  并且制定了类的T代表的类型是string*/
// m2.add('a');
// m2.add('c');
// m2.add('v');
// alert(m2.min())
// 函数类型接口
// interface ConfigFn{
//     (value1:string,value2:string):string;
// }
// var setData:ConfigFn = function(value1:string,value2:string):string{
//     return value1+value2
// }
// setData('name','张三');
// 1.泛型接口
// interface ConfigFn{
//     <T>(value:T):T;
// }
// var getData:ConfigFn = function<T>(value:T):T{
//     return value
// }
// getData<string>('张三')
// getData<string>(123)/*错误写法*/
// 2.泛型接口
// interface ConfigFn<T>{
//     (value:T):T;
// }
// function getData<T>(value:T):T{
//     return value
// }
// var myGetData:ConfigFn<string>=getData;
// myGetData('20')/*正确*/
// myGetData(20)/*错误*/
/*
定义一个User的类这个类的作用就是映射数据库字段然后定义一个MYsql的类这个类用于操作数据库然后把User类作为参数传入到MYsqlDB中

var user = new User({
    username:'zhansan',
    password:'123456'
})

var db = new MYsqldb();
db.add(user)
*/
// class User{
//     username:string|undefined;
//     password:string|undefined;
// }
// class MySqlDb{
//     add(user:User):boolean{
//         console.log(user)
//         return true;
//     }
// }
// var u = new User();
// u.username='zhangsan';
// u.password='123456';
// var Db = new MySqlDb();
// Db.add(u)
// class ArticleCate{
//     title:string|undefined;
//     desc:string|undefined;
//     status:number|undefined;
// }
// class MySqlDb{
//     add(info:ArticleCate):boolean{
//         console.log(info)
//         return true;
//     }
// }
// var a = new ArticleCate();
// a.title='国内';
// a.desc='国内新闻';
// a.status=1;
// var Db = new MySqlDb();
// Db.add(a)
// 操作数据库的泛型类
var MySqlDb = /** @class */ (function () {
    function MySqlDb() {
    }
    MySqlDb.prototype.add = function (info) {
        console.log(info);
        return true;
    };
    MySqlDb.prototype.update = function (info, id) {
        console.log(info);
        console.log(id);
        return true;
    };
    return MySqlDb;
}());
// 想给User表增加数据
// 1.定义一个User类和数据库进行映射
// class User{
//     username:string|undefined;
//     password:string|undefined;
// }
// var u = new User();
// u.username = 'zhangsan';
// u.password = '123456';
// var Db = new MySqlDb<User>();
// Db.add(u)
// 2.定义一个ArticleCate类 和数据库进行映射
var ArticleCate = /** @class */ (function () {
    function ArticleCate(params) {
        this.title = params.title;
        this.desc = params.desc;
        this.status = params.status;
    }
    return ArticleCate;
}());
// 增加操作
// var a  = new ArticleCate({
//     title:'分类',
//     desc:'1111',
//     status:1
// });
// 类当做参数的泛型类
// var Db = new MySqlDb<ArticleCate>();
// Db.add(a)
// 修改操作
var a = new ArticleCate({
    title: '分类1',
    desc: '111'
});
a.status = 0;
var Db = new MySqlDb();
Db.update(a, 12);
